package com.solo.common.orm.core.query.anno;

import com.mybatisflex.core.table.TableDef;
import com.solo.common.orm.core.query.enums.Connector;
import com.solo.common.orm.core.query.enums.QueryMode;

import java.lang.annotation.*;

/**
 * 查询条件注解
 * <pre>
 *     别名优先级：{@link #alias()} > {@link #table()} > {@link QueryTable#alias()} > {@link QueryTable#table()}
 * <pre/>
 * @author 十一
 * @since 2023/09/18 11:00
 * 人生若只如初见，何事秋风悲画扇
 **/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
@Inherited
public @interface Query {

    /**
     * 表名, 若不指定默认使用 {@link QueryTable#table()}
     * <pre>
     * 一般用于多表联查（同一查询对象中有不同的表的查询字段）
     * </pre>
     * <p>案例详见：方法 {@link com.solo.system.web.SysUserController#page} <br />
     * 查询对象类 {@link com.solo.system.model.user.req.UserQueryReq}</p>
     */
    Class<? extends TableDef>[] table() default {};

    /**
     * 表别名，若不指定默认使用 {@link #table()}，优先级高于 {@link #table()}
     * <pre>
     * 一般用于多表联查（同一查询对象中有不同的表的查询字段）
     * </pre>
     * <p>特别注意：如果是分页查询时，使用此属性，mybatis-flex的分页优化可能会将join优化掉，从而导致未找到列的sql异常，需要手动关闭分页优化</p>
     * <p>关闭教程：<a href="https://www.bilibili.com/video/BV1np4y1G7R9">关闭分页优化</a></p>
     * 建议优先使用 {@link #table()}
     */
    String alias() default "";

    /**
     * 字段名, 默认为属性名转下划线（userName -> user_name）
     */
    String value() default "";

    /**
     * 查询模式, 默认为全匹配查询
     */
    QueryMode mode() default QueryMode.EQ;

    /**
     * 连接本字段的方式, 默认为 AND
     */
    Connector connector() default Connector.AND;
    
    /**
     * 组 0表示不分组, 序号越小查询条件越靠前（必须是正数才生效）
     */
    int group() default 0;

}
